home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 2 / CU Amiga Magazine's Super CD-ROM 02 (1996)(EMAP Images)(GB)[!][issue 1996-04].iso / magazine / amiga_e / jrh-rkrm-partone / intuition / special / remembertest.e < prev   
Text File  |  1995-03-08  |  4KB  |  86 lines

  1. -> RememberTest - Illustrates the use of AllocRemember() and FreeRemember().
  2. -> E-Note: E's New() family of memory allocators are usually adequate...
  3.  
  4. MODULE 'dos/dos',
  5.        'exec/memory'
  6.  
  7. RAISE "MEM" IF AllocRemember()=NIL
  8.  
  9. -> Random sizes to demonstrate the Remember functions. */
  10. CONST SIZE_A=100, SIZE_B=200
  11.  
  12. PROC main()
  13.   methodOne()
  14.   methodTwo()
  15. ENDPROC RETURN_OK
  16.  
  17. -> MethodOne
  18. -> Illustrates using AllocRemember() to allocate all memory and FreeRemember()
  19. -> to free it all.
  20. PROC methodOne() HANDLE
  21.   DEF memBlockA=NIL, memBlockB=NIL, rememberKey=NIL
  22.  
  23.   memBlockA:=AllocRemember({rememberKey}, SIZE_A, MEMF_CLEAR OR MEMF_PUBLIC)
  24.   memBlockB:=AllocRemember({rememberKey}, SIZE_B, MEMF_CLEAR OR MEMF_PUBLIC)
  25.  
  26.   -> Both memory allocations succeeded.
  27.   -> The program may now use this memory.
  28.  
  29. EXCEPT DO
  30.   -> It is not necessary to keep track of the status of each allocation.
  31.   -> Intuition has kept track of all successful allocations by updating its
  32.   -> linked list of Remember nodes.  The following call to FreeRemember() will
  33.   -> deallocate any and all of the memory that was successfully allocated.
  34.   -> The memory blocks as well as the link nodes will be deallocated because
  35.   -> the "ReallyForget" parameter is TRUE.
  36.   ->
  37.   -> It is possible to have reached the call to FreeRemember() in one of three
  38.   -> states.  Here they are, along with their results.
  39.   ->
  40.   -> 1. Both memory allocations failed.
  41.   ->       RememberKey is still NIL.  FreeRemember() will do nothing.
  42.   -> 2. The memBlockA allocation succeeded but the memBlockB allocation failed.
  43.   ->       FreeRemember() will free the memory block pointed to by memBlockA.
  44.   -> 3. Both memory allocations were successful.
  45.   ->       FreeRemember() will free the memory blocks pointed to by
  46.   ->       memBlockA and memBlockB.
  47.   FreeRemember({rememberKey}, TRUE)
  48.   ReThrow()  -> E-Note: pass on exception if an error
  49. ENDPROC
  50.  
  51. -> MethodTwo
  52. -> Illustrates using AllocRemember() to allocate all memory, FreeRemember() to
  53. -> free the link nodes, and FreeMem() to free the actual memory blocks.
  54. PROC methodTwo() HANDLE
  55.   DEF memBlockA=NIL, memBlockB=NIL, rememberKey=NIL
  56.  
  57.   memBlockA:=AllocRemember({rememberKey}, SIZE_A, MEMF_CLEAR OR MEMF_PUBLIC)
  58.   memBlockB:=AllocRemember({rememberKey}, SIZE_B, MEMF_CLEAR OR MEMF_PUBLIC)
  59.  
  60.   -> Both memory allocations succeeded.
  61.   -> For the purpose of illustration, FreeRemember() is called at this point,
  62.   -> but only to free the link nodes.  The memory pointed to by memBlockA and
  63.   -> memBlockB is retained.
  64.   FreeRemember({rememberKey}, FALSE)
  65.  
  66.   -> Individually free the two memory blocks. The Exec FreeMem() call must be
  67.   -> used, as the link nodes are no longer available.
  68.   FreeMem(memBlockA, SIZE_A)
  69.   FreeMem(memBlockB, SIZE_B)
  70.  
  71. EXCEPT DO
  72.   -> It is possible to have reached the call to FreeRemember() in one of three
  73.   -> states.  Here they are, along with their results.
  74.   ->
  75.   -> 1. Both memory allocations failed.
  76.   ->    RememberKey is still NIL.  FreeRemember() will do nothing.
  77.   -> 2. The memBlockA allocation succeeded but the memBlockB allocation failed.
  78.   ->    FreeRemember() will free the memory block pointed to by memBlockA.
  79.   -> 3. Both memory allocations were successful.
  80.   ->    If this is the case, the program has already freed the link nodes with
  81.   ->    FreeRemember() and the memory blocks with FreeMem().  When
  82.   ->    FreeRemember() freed the link nodes, it reset RememberKey to NIL.
  83.   ->    This (second) call to FreeRemember() will do nothing.
  84.   FreeRemember({rememberKey}, TRUE)
  85. ENDPROC
  86.